package com.example.ftp.Util;

/**
 * @program: FTP
 * @description: FTP工具类
 **/


import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;


public class FtpUtil {

    private final static Logger logger = LoggerFactory.getLogger(FtpUtil.class);
    /** 本地字符编码 */
    private static String LOCAL_CHARSET = "GBK";
    // FTP协议里面，规定文件名编码为iso-8859-1
    private static String SERVER_CHARSET = "ISO-8859-1";

    private static FTPClient ftpClient;
    /**
     * 获取FTPClient对象
     *
     * @param host  FTP主机服务器
     * @param password FTP 登录密码
     * @param userName FTP登录用户名
     * @param port FTP端口 默认为21
     * @return
     */
    public static FTPClient getFTPClient(String host, int port, String userName, String password) {

        try {
            ftpClient = new FTPClient();
            ftpClient.connect(host, port);// 连接FTP服务器
            ftpClient.login(userName, password);// 登陆FTP服务器

            //检测延时
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                logger.info("未连接到FTP，用户名或密码错误。");
                ftpClient.disconnect();
            } else {
                logger.info("FTP连接成功。");
                // 开启服务器对UTF-8的支持，如果服务器支持就用UTF-8编码，否则就使用本地编码（GBK）
                if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持，如果服务器支持就用UTF-8编码，否则就使用本地编码（GBK）.
                    LOCAL_CHARSET = "UTF-8";
                }
                ftpClient.setControlEncoding(LOCAL_CHARSET);
                ftpClient.enterLocalPassiveMode();// 设置被动模式
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 设置文件传输的模式
            }
        } catch (SocketException e) {
            e.printStackTrace();
            logger.info("FTP的IP地址可能错误，请正确配置。");
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("FTP的端口错误,请正确配置。");
        }
        return ftpClient;
    }

    /**
     * 退出登录
     * @throws IOException
     */
    public static void close() throws IOException {
        if (ftpClient != null && ftpClient.isConnected()) {
            try {
                if (ftpClient.logout()){
                    logger.info("成功退出登录");
                    ftpClient.disconnect();
                    return;
                }
                logger.info("退出登录失败");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }


    /**
     * 客户端编码转成FTP协议编码，防止中文路径在服务端无法识别
     *
     * @param dirName 客户端GBK或者UTF-8编码
     */
    public static String clientCharsetToServer(String dirName) {
        try {
            return new String(dirName.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return dirName;
        }
    }

    /**
     * FTP协议编码转成客户端编码，防止服务端中文路径乱码
     *
     * @param dirName 服务端FTP协议ISO-8859-1编码
     */
    public static String serverCharsetToClient(String dirName) {
        try {
            return new String(dirName.getBytes(SERVER_CHARSET), LOCAL_CHARSET);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return dirName;
        }
    }

    /**
     * 得到当前服务端工作目录
     */
    public static String getWorkingDirectory() {
        try {
            return serverCharsetToClient(ftpClient.printWorkingDirectory());
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }









}


